package net.mlw.vlh.adapter.jdbc.util;

import java.text.NumberFormat;

/**
 * @program: valuelist
 * @Date: 2021/6/11 11:46
 * @Author: Hebing
 * @Description:
 */
public class CalUtil {
  //最后的去除加减
  public static String getzongde(String str){
    String kuohao=getkuohao(str);
    String chengchu=getchengchu(kuohao);
    String jiajian=getjiajian(chengchu);
    return jiajian;
  }
  /**
   * 第一步：去括号
   * */
  public static String getkuohao(String str){
    String newstr=str;
    if(newstr.contains("(")){
      int a=str.lastIndexOf("(");//判断最后一个括号
      String str1=str.substring(a,str.length());
      int b =str1.indexOf(")");
      String str2=str1.substring(1,b);//截取到最后一个括号：1229996*21/23+3
      String chengchu=getchengchu(str2);//计算括号里的乘除
      String jiajian=getjiajian(chengchu);//计算括号里的加减
      StringBuffer s=new StringBuffer(str);
      newstr=s.replace(a, a+b+1, jiajian).toString();//置换掉此括号将其换算为数字
      return getkuohao(newstr);//递归寻找下一个括号

    }
    return newstr;
  }
  /**
   * 去除括号里面的称号除号
   * */
  public static String getchengchu(String str){
    String newstr=str;
    if(str.contains("*")||str.contains("/")){//判断是否有乘除运算符
      String str2[]=str.split("[*/+-]");//
      String str3=str.replaceAll("\\d+","").replaceAll("\\.","");//去除所有数字和小数点获取运算符的串
      int a=0,b=0,c=0,star=0;
      if(str3.contains("*")&&str3.contains("/")){
        //判断如果有乘除都有的话优先计算前一个：1229996*21/23+3 先拿到 * 和 / 的索引
        a=str3.indexOf("*");
        b=str3.indexOf("/");
        // 判断 * / 那个在前面
        if(a>b){
          c=b;
          star=str.indexOf("/");
        }else{
          c=a;
          star=str.indexOf("*");
        }
      }else if(str3.contains("*")){//如果只有*没有/直接拿到
        c=str3.indexOf("*");
        star=str.indexOf("*");
      }else{
        c=str3.indexOf("/");
        star=str.indexOf("/");
      }
      //根据索引 计算公式
      String num=getsuanshi(str2[c]+str3.charAt(c)+str2[c+1]);
      StringBuffer s=new StringBuffer(str);//转换成buffer类
      //计算公式的起始结尾位置
      int kaishi=star-str2[c].length(),jieshu=star+str2[c+1].length()+1;
      //置换掉算式得到新串
      StringBuffer strs=s.replace(kaishi,jieshu ,num);
      newstr=strs.toString();
      return getchengchu(newstr);
    }
    return newstr;
  }
  /*
   * 去除括号里面的加减号
   * */

  public static String getjiajian(String str){
    String newstr=str;
    if(str.contains("+")||str.contains("-")){
      String str2[]=str.split("[*/+-]");
      String str3=str.replaceAll("\\d+","").replaceAll("\\.","");
      int a=0,b=0,c=0,star=0;
      if(str3.contains("+")&&str3.contains("-")){
        a=str3.indexOf("+");
        b=str3.indexOf("-");
        if(a>b){
          c=b;
          star=str.indexOf("-");
        }else{
          c=a;
          star=str.indexOf("+");
        }
      }else if(str3.contains("+")){
        c=str3.indexOf("+");
        star=str.indexOf("+");
      }else{
        c=str3.indexOf("-");
        star=str.indexOf("-");
      }
      String num=getsuanshi(str2[c]+str3.charAt(c)+str2[c+1]);
      StringBuffer s=new StringBuffer(str);
      int kaishi=star-str2[c].length(),jieshu=star+str2[c+1].length()+1;
      StringBuffer strs=s.replace(kaishi,jieshu ,num);
      newstr=strs.toString();
      return getjiajian(newstr);
    }
    return newstr;
  }
  /*
   * 两个数字加减乘除的计算
   */
  public static String getsuanshi(String str){
    double c=0.0;
    String str2[];
    if(str.contains("+")){
      str2=str.split("[+]");
      c=getjia(Double.parseDouble(str2[0]),Double.parseDouble(str2[1]));
    }else if(str.contains("-")){
      str2=str.split("[-]");
      c=getjian(Double.parseDouble(str2[0]),Double.parseDouble(str2[1]));
    }else if(str.contains("*")){
      str2=str.split("[*]");
      c=getcheng(Double.parseDouble(str2[0]),Double.parseDouble(str2[1]));
    }else if(str.contains("/")){
      str2=str.split("[/]");
      c=getchu(Double.parseDouble(str2[0]),Double.parseDouble(str2[1]));
    }
    NumberFormat format= NumberFormat.getInstance();
    //设置数的小数部分所允许的最大位数，避免小数位被舍掉
    format.setMaximumFractionDigits(30);
    //设置数的小数部分所允许的最小位数，避免小数位有多余的0
    format.setMinimumFractionDigits(0);
    //去掉科学计数法显示，避免显示为111,111,111,111
    format.setGroupingUsed(false);
    return format.format(c);
  }
  /**
   * 加减乘除的基础运算
   * @param a
   * @param b
   * @return
   */
  public static Double getjia(double a,double b){
    double c=a+b;
    return c;
  }
  public static Double getjian(double a,double b){
    double c=a-b;
    return c;
  }
  public static Double getcheng(double a,double b){
    double c=a*b;
    return c;
  }
  public static Double getchu(double a,double b){
    double c=a/b;
    return c;
  }
}
